from django_redis import get_redis_connection
from rest_framework import serializers


class ImageCodeCheckSerializer(serializers.Serializer):
    """图片验证码校验序列化器"""
    image_code_id = serializers.UUIDField()
    text = serializers.CharField(max_length=4, min_length=4)

    def validate(self, attrs):
        """校验"""
        image_code_id = attrs["image_code_id"]
        text = attrs["text"]

        # redis中查询真是图片验证码
        redis_conn = get_redis_connection("verify_codes")
        real_image_code_text = redis_conn.get("img_%s" % image_code_id)
        if not real_image_code_text:
            raise serializers.ValidationError("验证码无效")

        # 查询到验证码后,删除redis中的图片验证码
        redis_conn.delete("ima_%s" % image_code_id)

        # 存在，比较验证码
        if real_image_code_text.decode().lower() != text.lower():
            raise serializers.ValidationError("验证码错误")

        # 判断是否在60s内
        # get_serializer()爱创建序列化器对象时，会补充context属性。
        # context属性中包含三个值：request，format，view类视图对象

        # django累视图对象中，kwargs属性保存了路径提取出来的参数
        mobile = self.context["view"].kwargs["mobile"]
        send_flag = redis_conn.get("send_flag_%s" % mobile)
        if send_flag:
            raise serializers.ValidationError("请求次数过于频繁")

        return attrs

